/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package eksperemntotrrez;

import java.sql.*;
import java.util.*;

/**
 *
 * @author vasya
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.println("Ввидите строку для перевода:");
        String sStr = in.nextLine();
        System.out.println("Исходная строка: " + sStr);
        // Соеденюсь с базой данных.
        try{
//            Driver d = new com.mysql.jdbc.Driver();
            Class.forName("com.mysql.jdbc.Driver");
            Properties properties=new Properties();
            properties.setProperty("user","et");
            properties.setProperty("password","et");
            properties.setProperty("useUnicode","true");
            properties.setProperty("characterEncoding","utf8");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost/eksperimentoTradukanto", properties);

            
//            PreparedStatement st = con.prepareStatement("SELECT * FROM eksperimentoTradukanto.rustr WHERE MATCH (str) AGAINST ('?');");
//            st.setString(1, sStr);
//            ResultSet rs = st.executeQuery();
            Statement st = con.createStatement();
            // Запрошу английские строки релевантные исходной.
            ResultSet rs = st.executeQuery("SELECT id, str FROM eksperimentoTradukanto.enstr WHERE MATCH (str) AGAINST (\"" + sStr +" \\\"" + sStr + "\\\" \" IN BOOLEAN MODE);");
            System.out.println("SELECT id, str FROM eksperimentoTradukanto.enstr WHERE MATCH (str) AGAINST (\"" + sStr +" \\\"" + sStr + "\\\" \" IN BOOLEAN MODE);");
            int i = 1;
            TreeMap rez = new TreeMap();
            // Найду неболее тысячи релевантных строк.
            while(rs.next() && i <= 500){
                // Если найденная строка длиннее исходной более чем в 3 раза,
                // отбрасываю её, остальные обрабатываю.
                if(rs.getString(2).length() / sStr.length() < 3){
                    // Выведу релевантную запросу английскую строку.
                    System.out.println(" " + i + " Ищу строки: " + rs.getString(2));
                    ++i;
                    rez.put(editdist(sStr, rs.getString(2)), new rStr(rs.getString(2), rs.getInt(1)));
                }
            }

            System.out.println("\n\n\n\n\n\n");
            Statement st2 = con.createStatement();
            ResultSet rs2;
            Iterator itr = rez.keySet().iterator();
            rStr n;
            while(itr.hasNext()){
                n = ((rStr)(rez.get(itr.next())));
                // Выведу релевантную запросу английскую строку.
                System.out.println("\nПодходящая строка: " + n.s);

                // Найду и выведу все имеющиеся переводы текущей английской строки
                rs2 = st2.executeQuery("SELECT str FROM eksperimentoTradukanto.rustr, eksperimentoTradukanto.konformaEnRu WHERE eksperimentoTradukanto.konformaEnRu.enid = " + n.id + " AND rustr.id = konformaEnRu.ruid");
                while(rs2.next()){
                    System.out.println("    Перевод: " + rs2.getString(1));
                }
           }
            st2.close();
            st.close();
        }catch(Exception e){
            System.out.println("Ошибка: " + e.toString());
        }
    }

    /** Расстояние Левенштейна.
     *
     * Минимальное количество операций вставки одного символа, удаления одного
     * символа и замены одного символа на другой, необходимых для превращения
     * одной строки в другую.
     */
    private static int editdist(String S1, String S2) {
        int m = S1.length(), n = S2.length();
        int[] D1 = new int[n + 1];
        int[] D2 = new int[n + 1];

        for(int i = 0; i <= n; i ++)
            D2[i] = i;

        for(int i = 1; i <= m; i ++) {
            D1 = D2;
            D2 = new int[n + 1];
            for(int j = 0; j <= n; j ++) {
                if(j == 0) D2[j] = i;
                else {
                    int cost = (S1.charAt(i - 1) != S2.charAt(j - 1)) ? 1 : 0;
                    if(D2[j - 1] < D1[j] && D2[j - 1] < D1[j - 1] + cost)
                        D2[j] = D2[j - 1] + 1;
                    else if(D1[j] < D1[j - 1] + cost) D2[j] = D1[j] + 1;

                    else
                        D2[j] = D1[j - 1] + cost;
                }
            }
        }
        return D2[n];
    }
}